home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <ctype.h>
- #include "defs.h"
- /* ------------------ OAK4 91.12.28 Pumpkin ----------------- */
- #include <dos.h>
- #include <fmcfrb.h>
- #include <kkstr2.h>
- extern char *work;
- #define NOERR 0
- #define EGBERR -1
- #define MOSERR -2
- #define KANERR -3
-
- UCHAR modeW = 0x14;
-
- /******
- #include "oaklib.h"
- ******/
- /* ---------------------------------------------------------- */
-
- #define MAX_MAC 512
-
- extern char *Act_vram();
- extern void wrtstr();
- extern void memcpy();
- extern void memset();
- extern int strlen();
- extern void locate();
- extern void Dsp_box_vram();
- extern char *SPCSTR;
-
- short ReWrt_flg=FALSE;
-
- static struct _MACRO {
- int mc_ch;
- unsigned mc_ec;
- } mac_key[MAX_MAC+1];
- static int mac_cnt=0;
- static int mac_max=0;
- static int mac_flg=0;
-
- static int ch_bak;
- static unsigned ec_bak;
- static int hit_flg=FALSE;
-
- /* ------------------ OAK4 91.12.28 Pumpkin ----------------- */
- /*******************
- void putmode(int md,int sf,char *str)
- {
- wrtstr(str,71,MENU_Y,0x1F);
- }
- void putsys(int len,char *str,char *att)
- {
- int n,Bak_X,Bak_Y;
- char *vp;
- static int Bak_len=0;
- static char *Bak_vp=NULL;
- static char Bak_vram[160];
-
- Bak_X = Cur_X; Bak_Y = Cur_Y;
- Cur_X = 0 ; Cur_Y = MENU_Y-OFF_Y;
-
- if ( Bak_len > 0 )
- memcpy(Bak_vp,Bak_vram,Bak_len * 2);
-
- Bak_vp = Act_vram();
- memcpy(Bak_vram,Bak_vp,len * 2);
-
- n = len;
- vp = Bak_vp;
- while ( n-- > 0 ) {
- *(vp++) = (*(att++) & 0x0F) | 0x38;
- if ( iskanji((UCHAR)*str) ) {
- *(vp-1) |= 0x40;
- *(vp++) = *(str++);
- *(vp++) = (*(att++) & 0x0F) | 0x80;
- *(vp++) = *(str++);
- n--;
- } else
- *(vp++) = *(str++);
- }
-
- Dsp_box_vram((Bak_len > len ? Bak_len : len),0x07);
-
- Bak_len = len;
- Cur_X = Bak_X; Cur_Y = Bak_Y;
- }
-
- void putstr(int pos,int len,char *str,char *att)
- {
- int n;
- char *vp;
- static int Bak_len=0;
- static char *Bak_vp=NULL;
- static char Bak_vram[160];
-
- if ( Bak_len > 0 )
- memcpy(Bak_vp,Bak_vram,Bak_len * 2);
-
- Bak_vp = Act_vram();
- memcpy(Bak_vram,Bak_vp,len * 2 + 2);
-
- vp = Bak_vp;
- for ( n = 0 ; n < len ; n++ ) {
- *(vp++) = (*(att++) & 0x0F) | (n == pos ? 0x30 : 0x38);
- if ( iskanji((UCHAR)*str) ) {
- *(vp-1) |= 0x40;
- *(vp++) = *(str++);
- *(vp++) = (*(att++) & 0x0F) | 0x80;
- *(vp++) = *(str++);
- n++;
- } else
- *(vp++) = *(str++);
- }
- if ( len > 0 && n == pos ) {
- *vp |= 0x17;
- len++;
- }
-
- Dsp_box_vram((Bak_len > len ? Bak_len : len),0x07);
- Bak_len = len;
- }
- void Ent_sub(sw)
- int sw;
- {
- char bk,*vp;
-
- vp = (char *)Act_vram();
- if ( sw == FALSE ) {
- *vp &= 0xDF;
- Dsp_box_vram(1,0x07);
- } else {
- bk = *vp;
- *vp = (*vp & 0xC0) | 0x3C;
- Dsp_box_vram(1,0x07);
- *vp = bk;
- }
- }
- void Ent_tango(arg)
- char *arg;
- {
- int i,j,ch,sc;
- unsigned ec;
- int Ent_X,Ent_Y;
- int Bak_X,Bak_Y;
- char *vp,*Ent_vp,*End_vp;
- char att[80];
-
- Bak_X = Cur_X; Bak_Y = Cur_Y;
- Ent_sub(TRUE);
- *arg = '\0';
-
- memset(att,0x00,10);
- memset(att + 10,0x01,53);
- putsys(63,
- "単語登録 登録位置にカ-ソルを移動して実行キ-を押してください ",
- att);
-
- for ( ; ; ) {
- ch = KAN_read(0,&ec); sc = (ec >> 8) & 0xFF;
- Ent_sub(FALSE);
- if ( sc == 0x4F ) {
- if ( --Cur_X < 0 )
- Cur_X = MAX_X - 1;
- vp = (char *)Act_vram();
- if ( (*vp & 0x80) != 0 && Cur_X > 0 )
- Cur_X--;
- } else if ( sc == 0x51 && ++Cur_X >= MAX_X )
- Cur_X = 0;
- else if ( sc == 0x4D && --Cur_Y < 0 )
- Cur_Y = MENU_Y - 3;
- else if ( sc == 0x50 && ++Cur_Y > (MENU_Y - 3) )
- Cur_Y = 0;
- else if ( sc == 0x72 )
- goto ENDOF;
- else if ( sc == 0x73 )
- break;
- vp = (char *)Act_vram();
- if ( (*vp & 0x80) != 0 && Cur_X < (MAX_X - 1) )
- Cur_X++;
- Ent_sub(TRUE);
- }
-
- Ent_X = Cur_X; Ent_Y = Cur_Y;
- Ent_vp = (char *)Act_vram();
-
- putsys(36,
- "単語登録 登録範囲を指定してください",
- att);
-
- Cur_X = Ent_X ; Cur_Y = Ent_Y;
-
- for ( ; ; ) {
- ch = KAN_read(0,&ec); sc = (ec >> 8) & 0xFF;
- if ( sc == 0x4F ) {
- vp = (char *)Act_vram();
- if ( vp > Ent_vp ) {
- if ( --Cur_X < 0 ) {
- Cur_X = MAX_X - 1;
- if ( Cur_Y > 0 )
- Cur_Y--;
- }
- vp = (char *)Act_vram();
- if ( Cur_X > 0 && (*vp & 0x80) != 0 )
- Cur_X--;
- Ent_sub(FALSE);
- }
- } else if ( sc == 0x51 ) {
- Ent_sub(TRUE);
- vp = (char *)Act_vram();
- if ( (*vp & 0x40) != 0 && (*(vp+2) & 0x80) != 0 )
- Cur_X += 2;
- else
- Cur_X++;
- if ( Cur_X >= MAX_X ) {
- Cur_X -= MAX_X;
- if ( ++Cur_Y > (MENU_Y - 3) )
- Cur_Y = MENU_Y - 3;
- }
- } else if ( sc == 0x72 )
- goto CLROF;
- else if ( sc == 0x73 )
- break;
- }
- End_vp = (char *)Act_vram();
- for ( vp = Ent_vp ; vp < End_vp ; vp+=2 ) {
- if ( (unsigned char)(*(arg++) = *(vp+1)) < ' ' )
- *(arg-1) = ' ';
- }
- *arg = '\0';
- CLROF:
- i = Cur_X; j = Cur_Y;
- Cur_X = Ent_X; Cur_Y = Ent_Y;
- for ( ; ; ) {
- Ent_sub(FALSE);
- vp = (char *)Act_vram();
- if ( (*vp & 0x40) != 0 && (*(vp+2) & 0x80) != 0 )
- Cur_X += 2;
- else
- Cur_X++;
- if ( Cur_X >= MAX_X ) {
- Cur_X -= MAX_X;
- if ( ++Cur_Y > (MENU_Y - 3) )
- Cur_Y = MENU_Y - 3;
- }
- if ( Cur_Y >= j && Cur_X >= i )
- break;
- }
- ENDOF:
- Cur_X = Bak_X; Cur_Y = Bak_Y;
- locate();
- }
- void Tango_Touroku()
- {
- int len;
- char tmp[160];
-
- Ent_tango(tmp);
- if ( (len = strlen(tmp)) > 0 )
- KAN_touroku(len,tmp);
- putsys(0,"","");
- }
- *******/
- /* ---------------------------------------------------------- */
- /******************* Debug Code *******************
- void deb_dsp(ch,ec)
- int ch,ec;
- {
- char tmp[40];
-
- sprintf(tmp,"CH=%04X EC=%04X",ch,ec);
- wrtstr(tmp,0,0,0x1F);
- }
- ****************************************************/
-
- void mac_save()
- {
- switch(mac_flg) {
- case 0: case 2:
- mac_flg = 1;
- mac_max = 0;
- wrtstr("只今キ-マクロを定義中です",30,1,0x15);
- break;
- case 1:
- mac_flg = 2;
- mac_cnt = 0;
- mac_max--;
- wrtstr(SPCSTR,30,1,0x1F);
- break;
- }
- }
- void mac_go()
- {
- if ( mac_flg == 2 ) {
- mac_flg = 3;
- mac_cnt = 0;
- }
- }
- int kbhit()
- {
- if ( hit_flg != FALSE )
- return 1;
-
- if ( mac_flg == 3 ) {
- if ( mac_cnt < mac_max ) {
- hit_flg = TRUE;
- ch_bak = mac_key[mac_cnt].mc_ch;
- ec_bak = mac_key[mac_cnt].mc_ec;
- mac_cnt++;
- return 1;
- } else {
- mac_flg = 2;
- mac_cnt = 0;
- }
- }
-
- while ( (ch_bak = KAN_read(1,&ec_bak)) != 0xFFFF ) {
- if ( ch_bak & 0x8000 || (ec_bak & 0xFF00) > 0x5100 )
- ch_bak = 0xFFFF;
- switch(ec_bak & 0xFF00) {
- case 0xFF00:
- break;
-
- /* ------------------ OAK4 91.12.28 Pumpkin ----------------- */
- /************
- case 0x6D00:
- Tango_Touroku();
- break;
- **********/
- /* ---------------------------------------------------------- */
-
- default:
- hit_flg = TRUE;
- if ( mac_flg == 1 && mac_max < MAX_MAC ) {
- mac_key[mac_max].mc_ch = ch_bak;
- mac_key[mac_max].mc_ec = ec_bak;
- mac_max++;
- }
- return 1;
- }
- }
-
- return 0;
- }
- int Get_key(ec)
- unsigned *ec;
- {
- while ( kbhit() == 0 );
- hit_flg = FALSE;
- *ec = ec_bak & 0xFF14;
- return ch_bak;
- }
- int getch()
- {
- int ch;
- unsigned ec;
-
- while ( (ch = Get_key(&ec)) == 0xFFFF );
- return ch;
- }
-
- /* ------------------ OAK4 91.12.28 Pumpkin ----------------- */
-
- /*********************************
- かな漢ライブラリの初期化
- *********************************/
- int kanainit( int sw)
- {
- KANJ kana;
- union REGS regs;
- int col[16];
- extern void GetString( char *);
- extern void GetDspPos( int *, int *);
-
- kana.scrn = KAN_SCRN16;
- kana.egbw = work;
- kana.wPage = 0;
- kana.mosAp = KAN_MOSOFF;
- kana.gets = GetString;
- kana.getPos = GetDspPos;
- kana.maxX = 639;
- kana.maxY = 479;
-
- if( KAN_prepare( &kana) != KAN_NOERR)
- return KANERR;
-
- /* 従来のWINKライクなカラーテーブルの設定 */
- col[ 0] = 0x0f;
- col[ 1] = 0x01;
- col[ 2] = 0x02;
- col[ 3] = 0x03;
- col[ 4] = 0x04;
- col[ 5] = 0x05;
- col[ 6] = 0x06;
- col[ 7] = 0x07;
- col[ 8] = 0x08;
- col[ 9] = 0x09;
- col[10] = 0x0a;
- col[11] = 0x0b;
- col[12] = 0x04;
- col[13] = 0x06;
- col[14] = 0x03;
- col[15] = 0x01;
- if( KAN_setClrTbl( col) != KAN_NOERR)
- return KANERR;
-
- KAN_disp(KAN_DISPON);
-
- /* 入力モード設定 */
-
- if (sw != FALSE) {
- regs.h.ah = 0x02;
- regs.h.al = modeW;
- int86(0xec,®s,®s);
- }
- return NOERR;
- }
- /*********************************
- かな漢ライブラリの終了
- *********************************/
- void kanaend()
- {
- KAN_disp( KAN_DISPOFF);
- KAN_finish();
- }
- /*************************************
- 単語登録文字列取得ルーチン
- **************************************/
- void GetString( char *code)
- {
-
- int len,i;
- char t[81],*vp;
-
- vp = Act_vram(); len = 0;
- for ( i=0 ; i < 80 ; vp+=2,i++ ) {
- if ( (unsigned char)(t[i] = *(vp+1)) < ' ' ) t[i] = ' ';
- }
- t[i] = '\0';
-
- /* 文字列の長さ分だけコピーし、残りは'\0'で埋める */
- strcpy( code, t);
- len = strlen( t);
- memset( &code[len], 80 - len, '\0');
-
- }
-
- /*************************************
- 未確定文字列表示開始位置の取得
- **************************************/
- void GetDspPos( int *x, int *y)
- {
- *x = Cur_X * 8;
- *y = (Cur_Y+2) * 16;
- }
-
- int KAN_read(int sw, unsigned *enc)
- {
- int cnt=0,code;
- for(;;){
- code = KYB_read( sw, enc);
- if( KAN_inpchk() == KAN_MIUNSET) break;
- }
-
- return code;
- }
- /* ---------------------------------------------------------- */